console.log('基础类型')

// 1. 布尔值
let b: boolean = true;
// b = 1;
// b = '123';
b = false;

// 2. number
let num: number = 8;
num = 0b1010;
console.log(num);
// num = 'abc'; // error

// 3. 字符串类型
let str: string = '我是字符串';
// str = true; // error

// 4. 固定值类型
let z: 521 = 521; // 只能存521
// z = 520; // error

// 5. any 任意类型
let x: any = 123;

x = 'abc';
x = true;

// 6. void 表示空的, 该类型主要用在函数返回值上， 表示函数没有返回值，undefined
function fn(): void { // fn 函数 没有返回值

}
console.log('fn(): ', fn());

// 7. object 限制类型为对象,  用的比较少
let obj: object = {
    name: 'atguigu',
    age: 10
}
obj = [1, 2, 3];
obj = function () { }

// 以上说明：引用数据类型都可以给obj赋值不报错


// 8 数组类型

// 方式一：
let arr: string[] = ['1', 'a', 'b'];
// 方式二[泛型]：
let arr2: Array<number> = [1, 2, 3];
console.log(arr);

// 9. 元组类型：元组是一个特殊的数组【元素的类型和长度已经固定】

let t1: [string, number] = ['abc', 123];
// console.log(t1[0].) // 强大的语法提示
// console.log(t1.); // 强大的语法提示

let str333: string = 'abc';
// console.log(str333.) 强大的语法提示

// 10 . 枚举类型
// let sex = 1

// if(sex === 0){

// }else if(sex === 1){

// }
enum Gender {
    Female,
    Male = 100,
    Secret
}
let sex = 1;
if (sex === Gender.Male) {

} else if (Gender.Female) {

}
console.log(Gender);

// 11. 联合类型
let v1: number | string;
v1 = 5211314;
v1 = 'iloveyou'

// 12. null undefined 是任意类型的子类型[前提：关闭严格模式]
let num333:number = 123;
num333 = undefined;
let res:number = null;
res = 123;

// 13. 类型断言： 你别管，别检查，听我的老子说了算，除了事儿我负责
function fn222(x:number | string){
    x.toString()// 联合类型调用属性，只能调用联合类型中所有类型都有的属性
    if((x as string).length){// 如果调用的属性个别类型没有，那么就需要断言
        
    }else{

    }
}
let root = document.getElementById('root') as HTMLElement; // root 值 有可能是null 还有可能是HTMLElement

// 14. 类型推断：
let str999 = '123';
// str999 = 123;


// 防止变量冲突报错
export { }